#include <typescommon.h>
#include <inttypes.h>

// inttypes.h 定义了通用类型：int8_t，int16_t， int32_t， int64_t。便于移植32位与64位系统。c99标准。
//                地址(假定)	    变量名	   空间大小	        内存内容	 说明
// int a = 123;	  0x10。通过&a获得	 a	       4	          123	      操作a就是操作地址0x10-0x13这4个字节的空间
// int *b = a;	  0x14。通过&b获得	 b	       8(64位系统)	   0x10	       操作b就是操作地址0x14-0x1b这8个字节的空间,操作*b就是操作a的空间

// const char *buffer;常量指针（保存常量的指针，指针buffer可修改，指针buffer内容不可修改）。
// char * const buffer;指针常量（保存指针的常量，指针buffer不可变，指针buffer内容可修改）
// char buffer[10];数组是指针常量。buffer不能修改，但其内容buffer[0]可以修改。

int main(int argc, char **argv)
{
    int8_t tmpInt8 = -1;
    int16_t tmpInt16 = -1;
    int32_t tmpInt32 = -1;
    uint32_t tmpUint32 = -1;
    int64_t tmpInt64 = -1;
    const uint8_t tmpUint8 = -1;//常量。值不可变。

    int buf1[6] = {1, 2, 3, 4};//备注：0和'0'不一样，取查看ASCII表。
    // sizeof(数组)等于数组的长度。
    // 数组比较特殊,&buffer与buffer是同一值。
    logdebug("&buffer=%p, buffer=%p, size=%ld", &buf1, buf1, sizeof(buf1));
    for(int i = 0; i < ARRAY_LEN(buf1); i++)
    {
        logdebug("%d", buf1[i]);
    }

    char buf2[] = {'1', '2', '3', '\0'};//[]没有长度，他会根据初始化来决定。'1'表示1字节字符，"123"表示字符串常量。
    logdebug("buf2=%s", buf2);//这里也要说明以下，没有\n，终端不会显示，会等到下一个\n或者超出打印缓存区，或使用reflash。
    // 数组比较特殊,&buffer与buffer是同一值。
    logdebug("&buffer=%p, buffer=%p, size=%ld", &buf2, buf2, sizeof(buf2));


    //const修饰buf3的内容，buf3内容是不可以变的。而buf3是变量，放在栈区。
    // const char *buf3 = "12";//const修饰常量指针，不能改，但buf3可以只想其他指针。这里"12"在常量区
    const char *buf3 = "ab";
    logdebug("buf3 = %s", buf3);//'\n'为换行符，看ASCII表
    buf3 = buf2;//这是可以的
    //buf3[0] = '0';//这是不行的.编译提示错误。
    // &buf3和buf3的值是不一样的！&buf3是buf3的房间地址，buf3是房间内容
    logdebug("&buffer=%p, buffer=%p, size=%ld", &buf3, buf3, sizeof(buf3));

    //buf4是指针变量。
    char *buf4 = "3";//这里编译会提示警告，将const char *转为了char *。因为buf4是可以改变内容的。但是"3"是const类型。你去修改buf4[0]会崩溃。
    logdebug("buf3 = %s", buf4);
    //buf4[0] = '1';//因为buf4指向的是常量区，赋值导致崩溃。

#if 0
    char * const buf5 = "234";//buf1; //const修饰buf5
    logdebug("buf5 = %s", buf5);
    //buf5 = buf4;不可以
    //buf5[0] = '2';//本身是可以的，但是这里是不行的，因为"234"地址在常量区，修改会崩溃。
#else
    // buf5=buf2,修改内容就没问题。
    char * const buf5 = buf2;//const修饰buf5
    logdebug("buf5 = %s", buf5);
    //buf5 = buf4;不可以
    buf5[0] = '2';//buf2 可以修改内容
    logdebug("buf5 = %s", buf5);
#endif
    const char * const buf6 = "354";//自己悟。
    logdebug("buf6 = %s", buf6);

    
    return 1;
}



